package com.ssm.changeunit.command;

import com.ssm.changeunit.*;
import com.ssm.changeunit.CreateException;
import com.ssm.changeunit.persistance.DatabaseManager;
import com.ssm.changeunit.persistance.ManagedChangeUnitDAO;
import com.ssm.changeunit.persistance.ManagedChangeUnitDTO;
import com.ssm.changeunit.persistance.PersistanceException;
import com.ssm.changeunit.persistance.ProjectDAO;
import com.ssm.changeunit.persistance.ProjectDTO;
import com.ssm.changeunit.util.FileUtil;
import java.io.IOException;
import java.util.UUID;
import java.util.logging.Level;
import org.apache.log4j.Logger;

/**
 * 
 * @author 시리우스
 */
public class InitCommandWorker extends CommandWorker {
    private Logger log = Logger.getLogger(InitCommandWorker.class);
    
    public InitCommandWorker() {
    }

    public void work (CommandWorkerOptions commandWorkerOptions) throws CommandWorkerException {
        log.info("디렉토리 초기화..");
        
        // 디렉토리 생성
        FileUtil.directoryCreateOrNone(".changeunit");
        
        log.info("프로퍼티 초기화..");
        try {
            // 현재 Branch 프로퍼티를 master로 초기화
            Environment.setCurrentBranch("master");
        } 
        catch (IOException ex) {
            throw new CommandWorkerException("프로퍼티 초기화 실패");
        }
        
        log.info("데이터베이스 초기화..");
        
        // 데이터베이스가 존재하지 않는다면.. 그때 생성해야한다.
        try {
            log.debug("데이터베이스가 존재하는지 검사");
            
            if(!DatabaseManager.getInstance().isExists()) {
                log.debug("데이터베이스가 존재하지 않아 초기화합니다.");
                
                DatabaseManager.getInstance().initDatabase();
                
                try {
                    // 프로젝트 ID 생성
                    ProjectDAO projectDAO = new ProjectDAO();
                    
                    ProjectDTO projectDTO = new ProjectDTO();
                    projectDTO.setProjectId(UUID.randomUUID().toString());
                    
                    projectDAO.insert(projectDTO);
                    
                    // 첫 ChangeUnit 생성
                    ChangeUnit changeUnit = new ChangeUnitFactory().createProduct("0");
                    
                    // Branch 생성
                    Branch branch = new BranchFactory().createProduct("master");
                    branch.setCurrentChangeUnit(changeUnit);
                    branch.setOriginChangeUnit(changeUnit);
                    
                    changeUnit.addBranch(branch);
                    
                    // ManagedChangeUnitDTO 생성
                    ManagedChangeUnitDTO managedChangeUnitDTO = new ManagedChangeUnitDTO();
                    managedChangeUnitDTO.setManagedChangeUnitId("0");
                    new ManagedChangeUnitDAO().insert(managedChangeUnitDTO);
                }
                catch(CreateException ex) {
                    throw new CommandWorkerException("데이터베이스 초기화 실패", ex);
                }
                catch(PersistanceException ex) {
                    throw new CommandWorkerException("데이터베이스 초기화 실패", ex);
                }
            }
            else {
                log.error("이미 데이터베이스가 초기화되어 있습니다.");
            }
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException("데이터베이스 초기화 살패", ex);
        }
    }
}